/**
* \file		CompActuel.c
* \brief	Code des fonctions du module CompActuel
* \details	C'est ici qu'est le code des accesseurs, mutateurs ainsi que
*		la fonction de test vérifant le bon fonctionnement du module
*		CompActuel.
*/

#include "CompActuel.h"
#include <assert.h>

/*======================== Gestion de la mémoire =======================*/

void initCompActuel(CompActuel *pcompAct)
{
   setActionCompActuel(pcompAct, NULL);
   setCompCompActuel(pcompAct, NULL);
}

void creerCompActuel(CompActuel **pcompAct)
{
   *pcompAct = (CompActuel *)malloc(sizeof(CompActuel));
   initCompActuel(*pcompAct);
}

void libereCompActuel(CompActuel *pcompAct)
{
   setActionCompActuel(pcompAct, NULL);
   setCompCompActuel(pcompAct, NULL);
}

void detruireCompActuel(CompActuel *pcompAct)
{
   libereCompActuel(pcompAct);
   free(pcompAct);
}


/*============================= Accesseurs =============================*/

Action *getActionCompActuel(const CompActuel *pcompAct)
{
   return pcompAct->actionActuelle;
}

Comportement *getCompCompActuel(const CompActuel *pcompAct)
{
   return pcompAct->comp;
}

char *getNomCompCompActuel(const CompActuel *pcompAct)
{
   Comportement *pcomp = getCompCompActuel(pcompAct);

   if(NULL == pcomp)
	{
	   return NULL;
	}
   else
	{
	   return getNomComp(pcomp);
	}
}


/*============================== Mutateurs =============================*/

void setActionCompActuel(CompActuel *pcompAct, Action *nouvAct)
{
   pcompAct->actionActuelle = nouvAct;
}

void setCompCompActuel(CompActuel *pcompAct, Comportement *nouvComp)
{
   if(nouvComp != NULL)
	{
	   setActionCompActuel(pcompAct, getPremActionComp(nouvComp));
	}
   pcompAct->comp = nouvComp;
}

void setCompNomCompActuel(CompActuel *pcompAct, TabComp *ptabComp, char *nomComp)
{
   Comportement *compNouv;
   compNouv = rechercheCompNomTabComp(ptabComp, nomComp);
   setCompCompActuel(pcompAct, compNouv);
}


/*========================== Fonctions autres ==========================*/
void passeActionSuivanteCompActuel(CompActuel *pcompAct)
{
   setActionCompActuel(pcompAct, getActionSuivanteAction(getActionCompActuel(pcompAct)));
}


/*===================== Jouer la fonction du champ =====================*/

void executeFonctionActionCompActuel(CompActuel *pcompAct, Entrepot *pstock, Carte *pcarte, int modif, unsigned int x, unsigned int y, unsigned int z)
{
   Action *actEnCours = getActionCompActuel(pcompAct);
   executeFonctionAction(actEnCours, pstock, pcarte, modif, x, y, z);
}


/*========================== Fonction de Test ==========================*/

void testCompActuel()
{
   CompActuel *pcompAct;
   TabComp *ptabComp;
   Comportement *compTest;

   /* Création de l'environnement */
   Entrepot *pstock;
   Carte *pcarte;
   char *fichierDat = {"DatTerr"};
   TabTerrains tableauTerr;

   tableauTerr = creerTabTerrains(fichierDat);
   creerEntr(&pstock);
   pcarte = genererCarte(30,30,3,6,8,7,8,&tableauTerr);
   /*-----------------------------*/

   ptabComp = creerDonneeTabComp();

   printf("Test de CompActuel\n");
   printf("\tInitialisation d'un CompActuel\t\t");

   creerCompActuel(&pcompAct);
   assert(NULL == getActionCompActuel(pcompAct));
   assert(NULL == getCompCompActuel(pcompAct));

   printf("OK\n");

   printf("\tPassage d'une action à la suivante\n");

   setCompNomCompActuel(pcompAct, ptabComp, "RamMetal");
   printf("\t\tPremière action : %s\n", getNomAction(getActionCompActuel(pcompAct)));
   passeActionSuivanteCompActuel(pcompAct);
   printf("\t\tAction Suivante : %s\n", getNomAction(getActionCompActuel(pcompAct)));
   passeActionSuivanteCompActuel(pcompAct);
   printf("\t\tAction Suivante : %s\n", getNomAction(getActionCompActuel(pcompAct)));

   printf("\tJouer l'action en cours\n");
   passeActionSuivanteCompActuel(pcompAct);
   printf("\t\tvaleur de metal avant exécution : %u\n", getMetalEntr(pstock));
   executeFonctionActionCompActuel(pcompAct, pstock, pcarte, 1000, 1, 1, 1);
   printf("\t\tvaleur de metal après exécution : %u\n", getMetalEntr(pstock));

   printf("\tRécupération du nom du comportement actuel\n");
   compTest = rechercheCompNomTabComp(ptabComp, "Inactif");
   setCompCompActuel(pcompAct, compTest);
   executeFonctionActionCompActuel(pcompAct, pstock, pcarte, 1000, 1, 1, 1);
   printf("\t\tNom du comportement actuel : %s\n", getNomCompCompActuel(pcompAct));

   printf("\n");

   detruireCompActuel(pcompAct);
   detruireCarte(pcarte);
   detruireEntr(pstock);
   detruireTabTerrains(&tableauTerr);
   detruireTabComp(ptabComp);
}
